/**
 * 由Set动态属性与其遍历引发的惨案
 * 测试：模拟依赖集合动态变化时，直接遍历 Set 会导致无限循环
 * 核心原因：迭代器被「新增节点」“劫持” 了 —— 每次执行 env1 都会新增一个节点，迭代器的 next() 优先处理新增节点，跳过了原链表中的 env2
 */

// 1. 创建一个 Set，模拟你代码中的 deps（依赖集合）
const dynamicSet = new Set();

// 2. 定义两个“模拟effect环境函数”（对应你代码的 env1、env2）
let count = 0; // 计数，看 env1 执行了多少次
const env1 = () => {
  console.log(`=== 执行 env1（第 ${++count} 次）===`);

  // 关键：模拟你代码的 clearDeps → 从 Set 中删除当前 env1
  dynamicSet.delete(env1);
  console.log(
    '删除 env1 后，Set 内容：',
    [...dynamicSet].map((fn) => fn.name)
  );

  // 关键：模拟你代码的 track → 重新把 env1 加入 Set（动态新增）
  dynamicSet.add(env1);
  console.log(
    '重新添加 env1 后，Set 内容：',
    [...dynamicSet].map((fn) => fn.name)
  );
};

const env2 = () => {
  console.log('=== 执行 env2（这行永远不会打印！）===');
};

// 3. 初始化 Set：加入 env1、env2（模拟依赖收集后的 deps）
dynamicSet.add(env1);
dynamicSet.add(env2);
// console.log('初始 Set 内容：', [...dynamicSet].map(fn => fn.name)); // 输出：[env1, env2]

// 4. 直接遍历 Set（模拟你代码中“不复制快照”的错误 trigger）
// console.log('\n开始直接遍历 Set（无快照）：');
for (const fn of dynamicSet) {
  fn(); // 执行 Set 中的函数
}
